package main

import (
	"sync/atomic"
)

type Mutex struct {
	key  int32 // 锁是否被持有
	sema int32 // 信号量，可以阻塞、唤醒 goroutine
}

func xadd(val *int32, delta int32) (new int32) {
	for {
		v := *val
		if atomic.CompareAndSwapInt32(val, v, v+delta) {
			return v + delta
		}
	}
	panic("unreached")
}

// 待实现
func semAcquire(*int32) {}
func semRelease(*int32) {}

func (m *Mutex) Lock() {
	if xadd(&m.key, 1) == 1 { // 标识 +1，如果等于 1，则标识获取锁成功
		return
	}
	semAcquire(&m.sema) // 否则阻塞等待
}

func (m *Mutex) Unlock() {
	if xadd(&m.key, -1) == 0 { // -1，如果等于 0，则解锁成功
		return
	}
	semRelease(&m.sema) // 唤醒其它阻塞的goroutine
}

func main() {

}
